package main

import "fmt"

// 接口的值接收者和指针接收者

type mover interface {
	move()
}

type sayer interface {
	say()
}

// 接口组合
type animal interface {
	sayer
	mover
}

// 同一个类型可以实现多个接口
type person struct {
	name string
	age  int
}

// 使用值接收者实现接口，类型的值和类型的指针都可以存储到接口变量中

//func (p person) move() {
//	fmt.Printf("%d 的 %s moving moving  ", p.age, p.name)
//}

// 使用指针接收者 类型只能是指针才能存储到接口变量中
func (p *person) move() {
	fmt.Printf("%d 岁的 %s moving moving  \n", p.age, p.name)
}

func (p *person) say() {
	fmt.Printf("%d 岁的 %s say say   \n", p.age, p.name)
}

func main() {
	var m mover
	// 指针接收者的时候，这个就会报错
	//p1 := person{age: 18, name: "sunshicheng"}
	//m = p1
	//fmt.Println(m)
	p2 := &person{age: 19, name: "sunshicheng"}
	m = p2
	m.move()
	fmt.Println(m)

	var s sayer
	s = p2
	s.say()
	fmt.Println(s)
	// 组合的接口,实现全部功能
	fmt.Println(" ====>>>>> ")
	var a animal
	a = p2
	a.move()
	a.say()
	fmt.Println(a)

}
